/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.scrumpmt.web;

import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.scrumpmt.domain.*;
import org.scrumpmt.ejb.*;
import org.scrumpmt.web.model.*;
import org.scrumpmt.web.producto.EditarProductoBean;
import org.scrumpmt.web.producto.ListadoProductosBean;
import org.scrumpmt.web.producto.NuevoProductoBean;
import org.scrumpmt.web.protocol.Protocol;

/**
 *
 * @author aljiru
 */
@WebServlet(name = "FrontControllerServlet", urlPatterns = {"/FrontController"})
public class FrontControllerServlet extends HttpServlet {

    protected static final Logger log = Logger.getLogger(FrontControllerServlet.class.getName());
    private SprintFacade sprintFacade = lookupSprintFacade();
    private ProyectoFacade proyectoFacade = lookupProyectoFacade();
    private TareaFacade tareaFacade = lookupTareaFacade();
    private EstadoFacade estadoFacade = lookupEstadoFacade();
    private EsfuerzoFacade esfuerzoFacade = lookupEsfuerzoFacade();
    private ColaboradorFacade colaboradorFacade = lookupColaboradorFacade();

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        int action = 0;
        if (request.getParameter("action") != null) {
            action = Integer.parseInt(request.getParameter("action"));
        }

        log.log(Level.SEVERE, "Action: {0}", action);
        HttpSession misesion = request.getSession(false);

        // Creamos el DataOutputStream por el que enviaremos las respuestas JSON
        ServletOutputStream out = response.getOutputStream();
        DataOutputStream dos = new DataOutputStream(out);

        // Las respuestas JSON siempre las cargamos en este String
        String json = "";

        // Si la sesion no esta activa, y no estamos en la pantalla de login, se nos devuelve al login
        boolean ses = false;
        if (misesion != null && misesion.getAttribute("user") != null && misesion.getAttribute("user").
                getClass() == UserSession.class) {
            ses = true;
        }
        SesionJSON sesJSON = new SesionJSON(ses);
        JsonReader reader = null;
        boolean val;
        String resp;
        long miid;

        // case principal del Front Controller
        switch (action) {

            // En esta accion se realiza el Login
            case Protocol.LOGIN:
                // Leemos el JSON que viene en el POST
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                UserRequest user = new Gson().fromJson(reader, UserRequest.class);
                login lg = new login();
                lg.setEmail(user.usuario);
                lg.setPsswd(user.passwd);
                String redirect = lg.submit();
                boolean valido = false;
                if (!redirect.equals("")) {
                    valido = true;
                }
                UserResponse uresp = new UserResponse(valido);
                // Si el login es valido creamos la sesion
                if (valido) {
                    HttpSession sesion = request.getSession(true);
                    UserSession usession = new UserSession();
                    usession.setAdministrador(lg.getAdministrador());
                    usession.setEmail(lg.getEmail());
                    usession.setNombre(lg.getNombre());
                    sesion.setAttribute("user", usession);
                    // Establezco el ID de sesion
                    uresp.sessionID = sesion.getId();
                    uresp.admin = colaboradorFacade.findByEmail(user.usuario).getAdministrador();
                    // Cargo el listado de Productos
                    ListadoProductosBean lpBean = new ListadoProductosBean();
                    lpBean.getMyLogin().setAdministrador(usession.getAdministrador());
                    lpBean.getMyLogin().setNombre(usession.getNombre());
                    lpBean.consultaListado();
                    List<Proyecto> lProd = lpBean.getListado();
                    List<ProductoJSON> lpJSON = new ArrayList<ProductoJSON>();
                    if (lProd != null) {
                        for (Proyecto p : lProd) {
                            lpJSON.add(convertirProyecto(p));
                        }
                    }
                    uresp.lProductos = lpJSON;

                }
                // Devolvemos el JSON con la respuesta
                json = new Gson().toJson(uresp);
                log.log(Level.WARNING, json);
                break;

            // En este case se ha sellecionado un producto y se quiere acceder al listado de Sprints
            case Protocol.L_PRODUCTOS:
                ProductResponse presp;
                //Lo primero es comprobar que la sesion sigue bien
                if (ses) {
                    // En la variable value tiene que venir el Producto que se ha seleccionado
                    long producto = Long.parseLong(request.getParameter("value"));
                    misesion.setAttribute("producto", producto);
                    List<SprintJSON> lsJSON = obtenerJSONProductos(producto);
                    presp = new ProductResponse(lsJSON, sesJSON);

                } else {
                    presp = new ProductResponse(null, sesJSON);
                }
                json = new Gson().toJson(presp);
                break;

            // En este case se envia el sprint seleccionado y devuelven las tareas del sprint
            case Protocol.L_SPRINT:
                TaskResponse tresp;
                if (ses) {
                    // En la variable value tiene que venir el Sprint que se ha seleccionado
                    long sprint = Long.parseLong(request.getParameter("value"));
                    misesion.setAttribute("sprint", sprint);
                    Long producto = (Long) misesion.getAttribute("producto");
                    List<TareaJSON> ltJSON = obtenerJSONSprints(producto, sprint);
                    tresp = new TaskResponse(ltJSON, sesJSON);
                } else {
                    tresp = new TaskResponse(null, sesJSON);
                }
                json = new Gson().toJson(tresp);
                log.log(Level.INFO, "Tareas: {0}", json);
                break;

            case Protocol.L_TAREAS_ALL:
                TaskResponse trespall;
                if (ses) {
                    Long producto = (Long) misesion.getAttribute("producto");
                    List<TareaJSON> ltJSON = obtenerJSONTareasAll(producto);
                    trespall = new TaskResponse(ltJSON, sesJSON);
                } else {
                    trespall = new TaskResponse(null, sesJSON);
                }
                json = new Gson().toJson(trespall);
                break;

            case Protocol.L_DATOS_ESTAD:
                DatosEstad estadistica = new DatosEstad(sesJSON);
                if (ses) {
                    estadistica estad = new estadistica();
                    Long producto = (Long) misesion.getAttribute("producto");
                    String sprint = request.getParameter("sprint");
                    estad.setProductoId(String.valueOf(producto));
                    estad.setSprintId(sprint);
                    estad.inicializarEstadisticas();
                    estadistica.sessionID = misesion.getId();
                    estadistica.setTodoProyecto(estad.getTodo());
                    estadistica.setDoingProyecto(estad.getDoing());
                    estadistica.setDoneProyecto(estad.getDone());
                    estadistica.setBurndownActual(estad.getActual());
                    estadistica.setBurndownEstimado(estad.getEstimado());
                }
                json = new Gson().toJson(estadistica);
                break;

            case Protocol.L_COLAB_ALL:
                ListadoColaboradoresBean l = new ListadoColaboradoresBean();
                List<ColaboradorJSON> listJSON = new ArrayList<ColaboradorJSON>();
                for (Colaborador c : l.getListado()) {
                    log.log(Level.INFO, "Colaborador {0}", c.getNombre());
                    listJSON.add(convertirColaborador(c));
                }
                ListColabAll milista = new ListColabAll(listJSON);
                json = new Gson().toJson(milista);
                break;

            case Protocol.L_COLAB_PROD:
                ListadoColaboradoresBean l1 = new ListadoColaboradoresBean();
                List<ColaboradorJSON> listJSON1 = new ArrayList<ColaboradorJSON>();
                for (Colaborador c : l1.getListadoFiltradoProducto(request.getParameter("value"))) {
                    log.log(Level.INFO, "Colaborador {0}", c.getNombre());
                    listJSON1.add(convertirColaborador(c));
                }
                ListColabAll milista1 = new ListColabAll(listJSON1);
                json = new Gson().toJson(milista1);
                break;

            case Protocol.ADD_PROD:
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                ProductoJSON new_user = new Gson().fromJson(reader, ProductoJSON.class);
                NuevoProductoBean nuevoProd = new NuevoProductoBean();
                log.log(Level.SEVERE, new_user.toString());
                nuevoProd.setDes(new_user.getDes());
                nuevoProd.setFecfin(new_user.getFecfin());
                nuevoProd.setFecini(new_user.getFecini());
                nuevoProd.setHoras(new_user.getHorasJornada());
                nuevoProd.setNombre(new_user.getNombre());
                nuevoProd.setNomcli(new_user.getNomcli());
                nuevoProd.setColaborador(String.valueOf(new_user.getScrum_master()));
                resp = nuevoProd.submit();

                val = false;
                ProductoJSON pj = null;
                if (!resp.equals("")) {
                    val = true;
                    miid = Long.parseLong(resp);
                    Proyecto pro = proyectoFacade.find(miid);
                    pj = convertirProyecto(pro);
                }

                CreateUserResponse cur = new CreateUserResponse(val, sesJSON, pj);
                json = new Gson().toJson(cur);

                break;

            case Protocol.EDIT_PROD:
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                ProductoJSON edit_user = new Gson().fromJson(reader, ProductoJSON.class);
                EditarProductoBean editProd = new EditarProductoBean();
                Proyecto project = new Proyecto();
                project.setDes(edit_user.getDes());
                project.setFecfin(edit_user.getFecfin());
                project.setFecini(edit_user.getFecini());
                project.setHorasJornada(edit_user.getHorasJornada());
                project.setNombre(edit_user.getNombre());
                project.setNomcli(edit_user.getNomcli());
                project.setId(edit_user.getId());
                editProd.setId(String.valueOf(edit_user.getId()));
                editProd.setProyecto(project);
                editProd.setColaborador(String.valueOf(edit_user.getScrum_master()));
                resp = editProd.editar();

                val = false;
                if (!resp.equals("")) {
                    val = true;
                }

                EditProdResponse epr = new EditProdResponse(val, sesJSON);
                json = new Gson().toJson(epr);
                break;

            case Protocol.REMOVE_SPRINT:
                long producto2 = (Long) misesion.getAttribute("producto");
                long sprint = Long.parseLong(request.getParameter("value"));
                SprintBean sbd = new SprintBean();
                sbd.seleccionarSprint(String.valueOf(sprint));
                sbd.setProductoId(String.valueOf(producto2));
                sbd.deleteSprint();
                break;

            case Protocol.REMOVE_PROD:
                long prod = Long.parseLong(request.getParameter("value"));
                ListadoProductosBean le = new ListadoProductosBean();
                le.seleccionarProyecto(prod);
                le.eliminaProducto();
                break;

            case Protocol.REMOVE_TAREA:
                long task = Long.parseLong(request.getParameter("value"));
                BacklogBean bb = new BacklogBean();
                bb.setSelectedTarea(tareaFacade.find(task));
                bb.deleteTarea();
                break;

            case Protocol.ADD_COLAB:
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                ColaboradorJSON nuevo_colab = new Gson().fromJson(reader, ColaboradorJSON.class);
                log.log(Level.SEVERE, "Recibo añadir el colaborador " + nuevo_colab.getNombre() + "," + nuevo_colab.
                        getMail() + "," + nuevo_colab.getPassword() + "," + nuevo_colab.
                        getAdministrador() + "," + nuevo_colab.getId());
                newUser u = new newUser();
                u.setNombre(nuevo_colab.getNombre());
                u.setMail(nuevo_colab.getMail());
                u.setAdministrador(nuevo_colab.getAdministrador());
                u.setPassword(nuevo_colab.getPassword());
                u.setPassword2(nuevo_colab.getPassword());

                log.log(Level.SEVERE, "Recibo añadir el colaborador " + u.getNombre() + "," + u.
                        getMail() + "," + u.getPassword() + "," + u.getAdministrador());
                //log.log(Level.INFO, "Añadido correctamente el colaborador " + u.registrar());
                resp = u.registrar();

                val = false;
                ColaboradorJSON cj = null;
                if (!resp.equals("")) {
                    val = true;
                    miid = Long.parseLong(resp);
                    Colaborador col = colaboradorFacade.find(miid);
                    cj = convertirColaborador(col);
                }

                CreateColabResponse clr = new CreateColabResponse(val, sesJSON, cj);
                json = new Gson().toJson(clr);
                break;

            case Protocol.ADD_SPRINT:
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                SprintJSON ns = new Gson().fromJson(reader, SprintJSON.class);
                SprintBean new_sprint = new SprintBean();
                new_sprint.setDes(ns.getDes());
                new_sprint.setFecfin(ns.getFecfin());
                new_sprint.setFecini(ns.getFecini());
                Long producto = (Long) misesion.getAttribute("producto");
                new_sprint.setProductoId(String.valueOf(producto));

                resp = new_sprint.guardar();

                val = false;
                SprintJSON sj = null;
                if (!resp.equals("")) {
                    val = true;
                    miid = Long.parseLong(resp);
                    Sprint spr = sprintFacade.find(miid);
                    sj = convertirSprint(spr);
                }

                CreateSprintResponse csr = new CreateSprintResponse(val, sesJSON, sj);
                json = new Gson().toJson(csr);
                break;

            case Protocol.EDIT_COLAB:
                ListadoColaboradoresBean mibean = new ListadoColaboradoresBean();
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                DualListColabJSON nuevo_dual = new Gson().fromJson(reader, DualListColabJSON.class);
                List<Colaborador> asociados = new ArrayList<Colaborador>();
                List<Colaborador> noAsociados = new ArrayList<Colaborador>();
                for (TaskColab col : nuevo_dual.getColabAsociados()) {
                    asociados.add(mibean.getColByID(col.getColID()));
                }
                for (TaskColab col1 : nuevo_dual.getColabNoAsociados()) {
                    noAsociados.add(mibean.getColByID(col1.getColID()));
                }
                new EditarProductoBean().editarAsociados(asociados, noAsociados, request.
                        getParameter("value"));

                break;

            case Protocol.ADD_TAREA:
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                TareaJSON mitarea = new Gson().fromJson(reader, TareaJSON.class);
                log.log(Level.SEVERE, "Recibo nueva tarea " + mitarea.getDes() + "al proyecto" + misesion.
                        getAttribute("producto").toString());
                NuevaTareaBean mibeantarea = new NuevaTareaBean();
                mibeantarea.setDes(mitarea.getDes());
                mibeantarea.setEsfuerzo(String.valueOf(mitarea.getEsf()));
                mibeantarea.setTipo(mitarea.getTipo());
                mibeantarea.setProducto(String.valueOf(misesion.getAttribute("producto")));

                resp = mibeantarea.addTarea();

                val = false;
                TareaJSON tj = null;
                if (!resp.equals("")) {
                    val = true;
                    miid = Long.parseLong(resp);
                    Tarea tar = tareaFacade.find(miid);
                    List<Esfuerzo> lEsfuerzos = esfuerzoFacade.findByTarea(resp);
                    List<EsfuerzoJSON> lEsfJson = new ArrayList<EsfuerzoJSON>();
                    if (lEsfuerzos != null) {
                        for (Esfuerzo es : lEsfuerzos) {
                            lEsfJson.add(convertirEsfuerzo(es));
                        }
                    }
                    tj = convertirTarea(tar, lEsfJson);
                }

                CreateTareaResponse ctr = new CreateTareaResponse(val, sesJSON, tj);
                json = new Gson().toJson(ctr);
                break;

            case Protocol.CHANGE_ESTAD_TAREA:
                Long estado = Long.parseLong(request.getParameter("estad"));
                Estado e = estadoFacade.find(estado);
                Tarea estaTarea = tareaFacade.find(Long.parseLong(request.getParameter("value")));
                estaTarea.setIdEstadoFk(e);
                switch (Integer.parseInt(request.getParameter("estad"))) {
                    case 1:
                        //Dos fechas null                        
                        log.log(Level.SEVERE, "Paso a TODO la tarea" + request.getParameter("value"));
                        estaTarea.setFecini(null);
                        estaTarea.setFecfin(null);
                        break;
                    case 2:
                        //Fecha Inicia 
                        log.log(Level.SEVERE, "Paso a DOING la tarea" + request.getParameter("value"));
                        estaTarea.setFecini(new Date());
                        estaTarea.setFecfin(null);
                        break;
                    case 3:
                        //Fecha inicio y fecha fin
                        log.log(Level.SEVERE, "Paso a DONE la tarea" + request.getParameter("value"));
                        estaTarea.setFecfin(new Date());
                        break;
                    default:
                        log.log(Level.SEVERE, "No conozaco el nuevo estado de la tarea " + request.
                                getParameter("value"));
                        break;
                }
                tareaFacade.edit(estaTarea);
                break;

            case Protocol.ADD_ESF:
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                log.log(Level.SEVERE, "Recibo cambiar el esfuerzo de la tarea " + request.
                        getParameter("value") + " a " + request.getParameter("esf"));
                Esfuerzo esfuerzo = new Esfuerzo();
                Tarea tarea = tareaFacade.find(Long.parseLong(request.getParameter("value")));
                esfuerzo.setDuracion(Float.parseFloat(request.getParameter("esf")));
                esfuerzo.setFec(new Date());
                esfuerzo.setIdTareaFk(tarea);
                tarea.getEsfuerzoCollection().add(esfuerzo);
                tareaFacade.edit(tarea);
                break;

            case Protocol.ADD_TAREA_SPRINT:
                reader = new JsonReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
                AddSprintJSON asj = new Gson().fromJson(reader, AddSprintJSON.class);
                Tarea tar = tareaFacade.find(Long.parseLong(request.getParameter("value")));
                ProductoSeleccionadoBean psb = new ProductoSeleccionadoBean();
                psb.setTareaActual(tar);
                String des = asj.sprint;
                Sprint sp5 = sprintFacade.findByDes(des);
                String spact = String.valueOf(sp5.getId());
                psb.setSprintActual(spact);
                BacklogBean bb2 = new BacklogBean();
                bb2.setTareaActual(psb);
                bb2.setColaborador(asj.colaborador);
                bb2.asignar();
                break;

            default:
                log.log(Level.SEVERE, "No se ha definido bien la accion.");
        }
        log.log(Level.WARNING, "Desde el servidor voy a escribir: " + json);
        dos.write(json.getBytes());
        dos.flush();
        dos.close();
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private ProductoJSON convertirProyecto(Proyecto p) {
        ProductoJSON pj = new ProductoJSON(p.getId(), p.getNombre(), p.getDes(), p.getNomcli(), p.
                getFecini(), p.getFecfin(), p.getHorasJornada(), p.getIdScrumMaster().getId(), p.
                getIdScrumMaster().getNombre());
        return pj;
    }

    private SprintJSON convertirSprint(Sprint s) {
        SprintJSON sj = new SprintJSON(s.getId(), s.getFecini(), s.getFecfin(), s.getDes());
        return sj;
    }

    private TareaJSON convertirTarea(Tarea t, List<EsfuerzoJSON> l) {
        TareaJSON st;

        if (t.getIdSprintFk() == null) {
            st = new TareaJSON(t.getId(), t.getDes(), t.getEsf(), t.getFecini(), t.getFecfin(), t.
                    getIdTiptareaFk().getDes());
        } else {
            st = new TareaJSON(t.getId(), t.getDes(), t.getEsf(), t.getFecini(), t.getFecfin(), t.
                    getIdColaboradorFk().getNombre(), t.getIdEstadoFk().getId(), t.getIdSprintFk().
                    getDes(), t.getIdTiptareaFk().getDes(), l);
        }

        return st;
    }

    private ColaboradorJSON convertirColaborador(Colaborador c) {
        return new ColaboradorJSON(c.getId(), c.getNombre(), c.getPassword(), c.getMail(), c.
                getAdministrador(), c.getProyectoCollection(), c.getTareaCollection(), c.
                getProyectoCollection1());
    }

    private EsfuerzoJSON convertirEsfuerzo(Esfuerzo e) {
        return new EsfuerzoJSON(e.getId(), e.getFec(), e.getDuracion());
    }

    private List<SprintJSON> obtenerJSONProductos(long producto) {
        SprintBean sBean = new SprintBean();
        sBean.setProductoId(String.valueOf(producto));
        sBean.buscarListadoSprintd();
        List<Sprint> lSprint = sBean.getSprints();
        List<SprintJSON> lsJSON = new ArrayList<SprintJSON>();
        if (lSprint != null) {
            for (Sprint s : lSprint) {
                lsJSON.add(convertirSprint(s));
            }
        }
        return lsJSON;
    }

    private List<TareaJSON> obtenerJSONSprints(long producto, long sprint) {
        SprintBean sBean = new SprintBean();
        sBean.setProductoId(String.valueOf(producto));
        sBean.setSprintId(String.valueOf(sprint));
        sBean.buscarTareasSprint();
        List<Tarea> lTareas = sBean.getTareas();
        List<TareaJSON> ltJSON = new ArrayList<TareaJSON>();
        if (lTareas != null) {
            for (Tarea t : lTareas) {
                List<Esfuerzo> lEsfuerzos = esfuerzoFacade.findByTarea(String.valueOf(t.getId()));
                List<EsfuerzoJSON> lEsfJson = new ArrayList<EsfuerzoJSON>();
                if (lEsfuerzos != null) {
                    for (Esfuerzo es : lEsfuerzos) {
                        lEsfJson.add(convertirEsfuerzo(es));
                    }
                }
                ltJSON.add(convertirTarea(t, lEsfJson));
            }
        }
        return ltJSON;
    }

    private List<TareaJSON> obtenerJSONTareasAll(long producto) {
        BacklogBean backlog = new BacklogBean();
        backlog.setProducto(String.valueOf(producto));
        backlog.buscarBacklog();
        List<Tarea> lTareas = backlog.getListado();
        List<TareaJSON> ltJSON = new ArrayList<TareaJSON>();
        if (lTareas != null) {
            for (Tarea t : lTareas) {
                List<Esfuerzo> lEsfuerzos = esfuerzoFacade.findByTarea(String.valueOf(t.getId()));
                List<EsfuerzoJSON> lEsfJson = new ArrayList<EsfuerzoJSON>();
                if (lEsfuerzos != null) {
                    for (Esfuerzo es : lEsfuerzos) {
                        lEsfJson.add(convertirEsfuerzo(es));
                    }
                }
                ltJSON.add(convertirTarea(t, lEsfJson));
            }
        }
        return ltJSON;
    }

    private SprintFacade lookupSprintFacade() {
        try {
            Context c = new InitialContext();
            return (SprintFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/SprintFacade!org.scrumpmt.ejb.SprintFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private ProyectoFacade lookupProyectoFacade() {
        try {
            Context c = new InitialContext();
            return (ProyectoFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/ProyectoFacade!org.scrumpmt.ejb.ProyectoFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private TareaFacade lookupTareaFacade() {
        try {
            Context c = new InitialContext();
            return (TareaFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/TareaFacade!org.scrumpmt.ejb.TareaFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private EstadoFacade lookupEstadoFacade() {
        try {
            Context c = new InitialContext();
            return (EstadoFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/EstadoFacade!org.scrumpmt.ejb.EstadoFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private EsfuerzoFacade lookupEsfuerzoFacade() {
        try {
            Context c = new InitialContext();
            return (EsfuerzoFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/EsfuerzoFacade!org.scrumpmt.ejb.EsfuerzoFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private ColaboradorFacade lookupColaboradorFacade() {
        try {
            Context c = new InitialContext();
            return (ColaboradorFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/ColaboradorFacade!org.scrumpmt.ejb.ColaboradorFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }
}